home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World Interactive 7
/
PC World Interactive 7.iso
/
program
/
cprog.EXE
/
OBJ2ASM.ZIP
/
OUBUFF.C
< prev
next >
Wrap
C/C++ Source or Header
|
1991-10-01
|
7KB
|
213 lines
#include <stdio.h>
#include <string.h>
#include "o.h"
#define NOTHING 0
#define ASCII 1
#define SPECIAL 2
#define BUFFSIZE 0x1000+0x10
char *buff_beg; /* Pointer to first character in buffer */
char *buff_end; /* Pointer to last character in buffer */
char *buff_cur; /* Pointer to last getc()'d character */
char buff[BUFFSIZE] = { '\0' }; /* Array for actual buffer contents */
void empty_string( length )
int length;
{
int prev_mode;
int curr_mode;
int out_count;
char out_buff[OPSIZE+1];
int this_char;
char byte_buff[5];
int byte_len;
char *pre_text;
int pre_len;
prev_mode = NOTHING;
out_count = 0;
out_buff[0] = '\0';
buff_reseek();
while ( length ) {
this_char = buff_regetc();
if ( this_char < ' ' || this_char > '~' ) {
curr_mode = SPECIAL;
sprintf( byte_buff, "0%02Xh", this_char );
byte_len = 4;
} else {
curr_mode = ASCII;
if ( this_char == '\'' ) {
strcpy( byte_buff, "''" ); /* Two apostrophes to indicate one */
byte_len = 2;
} else {
sprintf( byte_buff, "%c", this_char );
byte_len = 1;
}
}
pre_text = ""; /* Default to no separator */
pre_len = 0;
if ( prev_mode == ASCII && curr_mode == SPECIAL ) {
pre_text = "',"; /* Separator between ascii and hex */
pre_len = 2;
}
if ( prev_mode == SPECIAL && curr_mode == ASCII ) {
pre_text = ",'"; /* Separator between hex and ascii */
pre_len = 2;
}
if ( prev_mode == SPECIAL && curr_mode == SPECIAL ) {
pre_text = ","; /* Separator between hex codes */
pre_len = 1;
}
if ( out_count + pre_len + byte_len >= OPSIZE ) {
/*
** Output current line and proceed to next line
*/
if ( prev_mode == ASCII ) {
strcat( out_buff, "'" );
}
if ( pass == 3 ) {
out_directive( "db" );
out_operand( out_buff );
out_endline();
}
out_count = 0;
out_buff[0] = '\0';
prev_mode = NOTHING;
pre_text = ""; /* Back to no seperator */
pre_len = 0;
}
if ( prev_mode == NOTHING && curr_mode == ASCII ) {
pre_text = "'";
pre_len = 1;
}
strcat( out_buff, pre_text );
strcat( out_buff, byte_buff );
out_count += pre_len + byte_len;
prev_mode = curr_mode;
if ( this_char == '\0' || this_char == '$' ) {
/*
** Output current line (with this_char) and proceed to next line
*/
if ( prev_mode == ASCII ) {
strcat( out_buff, "'" );
}
if ( pass == 3 ) {
out_directive( "db" );
out_operand( out_buff );
out_endline();
}
out_count = 0;
out_buff[0] = '\0';
prev_mode = NOTHING;
pre_text = ""; /* Back to no seperator */
pre_len = 0;
}
--length;
}
if ( prev_mode != NOTHING ) {
if ( prev_mode == ASCII ) {
strcat( out_buff, "'" );
}
if ( pass == 3 ) {
out_directive( "db" );
out_operand( out_buff );
out_endline();
}
}
}
/*------------------------------------------------------------------------------
** buff_init() - Initialize the buffer variables for an empty buffer.
**------------------------------------------------------------------------------
*/
int buff_init( length )
int length;
{
if ( length > BUFFSIZE ) fmt_error("Record too large");
buff_beg = &buff[0];
buff_cur = buff_beg;
length = fread( buff_beg, sizeof(char), length, o_file );
buff_end = buff_beg + length; /* Last character will be at buff[length-1] */
return( length );
}
/*------------------------------------------------------------------------------
** buff_add() - Add to an initialized the buffer.
**------------------------------------------------------------------------------
*/
int buff_add( length )
int length;
{
if ( length + (buff_end-buff_beg) > BUFFSIZE )
fmt_error("Adding too much to internal buffer");
length = fread( buff_end, sizeof(char), length, o_file );
buff_end = buff_end + length; /* Last character at buff[length-1] */
return( length );
}
/* --------------------------------------------------------------------------
** buff_getc() - Get a character from the buffer, if the buffer is empty, the
** stream is read. The buffer position pointer is adjusted
** foreward 1 byte. If the buffer position pointer is equal to
** the buffer end pointer, then and EOF value is returned.
**------------------------------------------------------------------------------
*/
int buff_getc()
{
uchar ch;
int result;
if ( buff_cur == buff_end ) { /* At End of Buffer? */
result = EOF;
} else {
ch = *buff_cur++;
result = ch;
}
return( result );
}
/*------------------------------------------------------------------------------
** buff_regetc() - Get a character which has already been getc'd. The first
** character regotten will be the first character after any
** previous buff_regetc() or buff_empty(). If the count
** of the number of characters in the buffer is zero, an EOF
** value is returned. Otherwise, The buffer beginning pointer
** is adjusted foreward 1 byte and the character is returned.
**------------------------------------------------------------------------------
*/
int buff_regetc()
{
int result;
if ( buff_beg == buff_end ) { /* Buffer empty? */
result = EOF;
} else {
result = *buff_beg++;
buff_cur = buff_beg;
}
return( result );
}
/*------------------------------------------------------------------------------
** buff_reseek() - Move the buffer position pointer back to the buffer
** beginning pointer.
**------------------------------------------------------------------------------
*/
void buff_reseek()
{
buff_cur = buff_beg; /* Position buff_getc() to beginning */
}
/*------------------------------------------------------------------------------
** buff_empty() - Moves the buffer beginning pointer to the buffer position
** pointer.
**------------------------------------------------------------------------------
*/
void buff_empty()
{
buff_beg = buff_cur; /* Forget all characters before cur ptr */
}